package com.wxapp.sale.service.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.enums.SqlKeyword;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wxapp.common.constant.base.IBaseService;
import com.wxapp.common.constant.pojo.vm.ResultVm;
import com.wxapp.common.constant.pojo.vo.UserVo;
import com.wxapp.common.core.annotation.GetCatch;
import com.wxapp.common.util.check.CheckUtil;
import com.wxapp.common.util.condition.ConditionUtil;
import com.wxapp.common.util.copy.CopyUtil;
import com.wxapp.common.util.menuTree.TreeUtil;
import com.wxapp.common.util.random.RandomUtil;
import com.wxapp.sale.api.pojo.entity.GoodsTypeDO;
import com.wxapp.sale.api.pojo.vm.goodType.PGoodsTypeDetailVm;
import com.wxapp.sale.api.pojo.vm.goodType.PGoodsTypeListVm;
import com.wxapp.sale.api.pojo.vm.goodType.PGoodsTypeSelectVm;
import com.wxapp.sale.api.pojo.vo.goodType.QGoodsTypeAddVo;
import com.wxapp.sale.api.pojo.vo.goodType.QGoodsTypePageVo;
import com.wxapp.sale.api.pojo.vo.goodType.QGoodsTypeUpdateVo;
import com.wxapp.sale.service.mapper.GoodsTypeMapper;
import com.wxapp.sale.service.service.GoodsTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author lgl
 */
@Service
@RequiredArgsConstructor
public class GoodsTypeServiceImpl extends IBaseService implements GoodsTypeService {
    private final GoodsTypeMapper goodsTypeMapper;

    @Override
    public ResultVm<String> add(UserVo userVo, QGoodsTypeAddVo qGoodsTypeAddVo) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(CheckUtil.isNotNullString(qGoodsTypeAddVo.getName()), GoodsTypeDO::getName, qGoodsTypeAddVo.getName()).eq(GoodsTypeDO::getStatus, true);
        var aLong = goodsTypeMapper.selectCount(wrapper);
        if (aLong > 0) {
            return error("已经建了该数据，请不要重复新建");
        }
        var wxappGoodsType = CopyUtil.copyObjectNew(qGoodsTypeAddVo, GoodsTypeDO::new, (s, r) -> {
            r.setCode(RandomUtil.getAllRandom(6));
            r.setCreateBy(userVo.getId());
            return null;
        });
        goodsTypeMapper.insert(wxappGoodsType);
        return success("更新成功");
    }

    @Override
    public ResultVm<Page<PGoodsTypeListVm>> page(QGoodsTypePageVo qGoodsTypePageVo, UserVo userVo) {
        Page<GoodsTypeDO> page = getPage(qGoodsTypePageVo,userVo);
        return success(CopyUtil.copyPage(page, PGoodsTypeListVm::new, null));
    }

    @Override
    public ResultVm<String> update(UserVo userVo, QGoodsTypeUpdateVo qGoodsTypeUpdateVo) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GoodsTypeDO::getStatus, true).eq(GoodsTypeDO::getId, qGoodsTypeUpdateVo.getId());
        var goodsType = goodsTypeMapper.selectFirst(wrapper);
        if (CheckUtil.isNullObject(goodsType)) {
            return error("没有找到商品信息");
        }
        CopyUtil.copyObject(qGoodsTypeUpdateVo, goodsType, (s, r) -> {
            r.setUpdateBy(userVo.getId());
            return null;
        });
        goodsTypeMapper.updateById(goodsType);
        return success("更新成功");
    }

    @Override
    public ResultVm<String> delete(UserVo userVo, String id) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GoodsTypeDO::getStatus, true).eq(GoodsTypeDO::getId, id);
        var goodsType = goodsTypeMapper.selectFirst(wrapper);
        if (CheckUtil.isNullObject(goodsType)) {
            return error("没有找到商品信息");
        }
        goodsType.setStatus(false);
        goodsTypeMapper.updateById(goodsType);
        return success("删除成功");
    }

    @Override
    public ResultVm<PGoodsTypeDetailVm> detail(String id) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GoodsTypeDO::getStatus, true).eq(GoodsTypeDO::getId, id);
        var goodsType = goodsTypeMapper.selectFirst(wrapper);
        if (CheckUtil.isNullObject(goodsType)) {
            return error("没有找到商品信息");
        }
        return success(CopyUtil.copyObjectNew(goodsType, PGoodsTypeDetailVm::new, null));
    }

    @Override
    public ResultVm<List<PGoodsTypeSelectVm>> select(String name, UserVo userVo) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GoodsTypeDO::getStatus, true).like(CheckUtil.isNotNullString(name), GoodsTypeDO::getName, name)
        .select(GoodsTypeDO::getId, GoodsTypeDO::getName, GoodsTypeDO::getPid)
                .eq(GoodsTypeDO::getCreateBy,userVo.getId());
        var goodsType = goodsTypeMapper.selectList(wrapper);
        var pSelectVms = CopyUtil.copyListNew(goodsType, PGoodsTypeSelectVm::new, null);
        return success(TreeUtil.buildTree(pSelectVms,null));
    }

    @Override
    @GetCatch(key = "#pid.concat('_goodTypeList')")
    public ResultVm<List<PGoodsTypeDetailVm>> goodTypeList(String pid) {
        LambdaQueryWrapper<GoodsTypeDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GoodsTypeDO::getStatus, true)
                .eq(CheckUtil.isNotNullString(pid),GoodsTypeDO::getPid,pid)
                .isNull(CheckUtil.isNullString(pid),GoodsTypeDO::getPid);
        var goodsType = goodsTypeMapper.selectList(wrapper);
        return success(CopyUtil.copyListNew(goodsType, PGoodsTypeDetailVm::new, null));
    }

    private Page<GoodsTypeDO> getPage(QGoodsTypePageVo qGoodsTypePageVo, UserVo userVo) {
        Map<SFunction<GoodsTypeDO, ?>, SqlKeyword> conditions = new HashMap<>();
        conditions.put(GoodsTypeDO::getName, SqlKeyword.LIKE);
        var page = ConditionUtil.getPage(qGoodsTypePageVo, GoodsTypeDO.class);
        var condition = ConditionUtil.getSCondition(GoodsTypeDO::new, qGoodsTypePageVo, null, conditions,userVo.getId());
        return goodsTypeMapper.selectPage(page, condition);
    }

}
